package com.bml.architect.springboot.config;

import com.bml.architect.springboot.utils.Constants;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Map;

/**
 * 延迟队列（ttl+死信队列）实现
 * 发送消息到正常交换机normal_topic_exchange，转到正常队列normal_dlx_queue
 * 超时过后，转发到死信交换机delay_dlx_exchange，通过key=dlx.msg发送
 * 然后delay_dlx_queue死信队列就能接受到延迟队列中的消息
 */
@Configuration
public class DelayConfig {

    /**
     * 设置正常队列
     * @return
     */
    @Bean
    public Queue normalQ() {
        Queue queue = new Queue(Constants.NORMAL_QUEUE);
        Map<String, Object> arguments = queue.getArguments();
        //设置延迟过后发往的死信交换机名称
        arguments.put("x-dead-letter-exchange", Constants.DELAY_DLX_EXCHANGE);
        //送给死信交换机的routingkey
        arguments.put("x-dead-letter-routing-key", "dlx.msg");
        //设置队列的过期时间 ttl
        arguments.put("x-message-ttl", 10000);
        //设置队列的长度限制
        arguments.put("x-max-length", 10);
        return queue;
    }

    /**
     * 创建一个正常的交换机
     * @return
     */
    @Bean
    public TopicExchange normalExchange(){
       return new TopicExchange(Constants.NORMAL_EXCHANGE);
    }
    /**
     * 正常交换机和正常的队列绑定
     */
    @Bean
    public Binding normalBinding(){
        return BindingBuilder.bind(normalQ()).to(normalExchange()).with("normal.#");
    }

    /**
     * 声明一个死信队列
     */
    @Bean
    public Queue dlxQueue(){
        return new Queue(Constants.DELAY_DLX_QUEUE);
    }
    /**
     * 声明一个死信交换机
     */
    @Bean
    public TopicExchange dlxTopicExchange(){
        return new TopicExchange(Constants.DELAY_DLX_EXCHANGE);
    }
    /**
     * 绑定死信交互机于队列的关系
     */
    @Bean
    public Binding dlxBinding(){
        return BindingBuilder.bind(dlxQueue()).to(dlxTopicExchange()).with("dlx.#");
    }
}
